/*
*
* Copyright (c) 2011 Vaulting Systems International
* 
* Permission is hereby granted, free of charge, to any person obtaining a copy 
* of this software and associated documentation files (the "Software"), to deal 
* in the Software without restriction, including without limitation the rights 
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 
* of the Software, and to permit persons to whom the Software is furnished to do  
* so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all  
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 
* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE  
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
*/
package com.ekeymanlib.dao;

import java.util.List;

import com.ekeymanlib.domain.AppDevice;
import com.ekeymanlib.domain.Resource;
import com.ekeymanlib.dto.SearchFilter;

public class ResourceDaoImpl extends AbstractDao implements ResourceDao{

	public ResourceDaoImpl(){}
	
	public void saveResource(Resource resource){
		getHibernateTemplate().saveOrUpdate(resource);
	}

	@SuppressWarnings("unchecked")
	public Resource getResource(String resourceUri, 
			String application, String device, String publicKey){
		
		Resource resource = null;
		
		String queryString ="from Resource as r " +
		"where r.resourceUri = :resourceUri " +
		"and r.appDevice.application = :application " +
		"and r.appDevice.device = :device " +
		"and r.appDevice.publicKey = :publicKey ";;
		
		String[] paramNames = new String[4];
		paramNames[0] = "resourceUri";
		paramNames[1] = "application";
		paramNames[2] = "device";
		paramNames[3] = "publicKey";
		
		Object[] values = new Object[4];
		values[0] = resourceUri;
		values[1] = application;
		values[2] = device;
		values[3] = publicKey;
		
		List<Resource> resources = getHibernateTemplate().findByNamedParam(queryString, paramNames, values);
		
		if(resources != null && !resources.isEmpty()){
			resource = resources.get(0);
		}
		
		return resource;
	}
	
	public void deleteResource(String resourceUri, 
			String application, String device, String publicKey){
		
		Resource resource = getResource(resourceUri, application, device, publicKey);
		if(resource != null){
			getHibernateTemplate().delete(resource);
		}
	}
	
	public Resource getResourceById(long id){
		return getHibernateTemplate().get(Resource.class, id);
	}
	
	public void deleteResourceById(long id, String apiKey){
		
		Resource resource = getResourceById(id);
		
		if(resource != null){
			if(apiKey.equalsIgnoreCase(resource.getAppDevice().getVendor().getApiKey())){
				getHibernateTemplate().delete(resource);
			}
		}
	}	
	
	public long getResourceCount(List<SearchFilter> searchFilters) {

		return getCount(searchFilters, Resource.class);
	}
	
	@SuppressWarnings("unchecked")
	public List<Resource> findResources(List<SearchFilter> searchFilters, 
			String sortIndex, String sortOrder, int firstResult, int maxResults) {

		return findAll(searchFilters, Resource.class, 
				sortIndex, sortOrder, firstResult, maxResults);
	}
	
}
